# 作者： 李泉志
# 2025年01月08日15时04分秒
# 2947029073@qq.com

# 2、求两个有序数字列表的公共元素
def func2(list1, list2):
    result = []
    i = j = 0
    while i < len(list1) and j < len(list2):
        if list1[i] == list2[j]:
            result.append(list1[i])
            i += 1
            j += 1
        elif list1[i] < list2[j]:
            i += 1
        else:
            j += 1
    return result


# 3、给定一个n个整型元素的列表a，其中有一个元素出现次数超过n/2，求这个元素
def func3(list1):
    candidate = None
    count = 0
    for num in list1:
        if count == 0:
            candidate = num
            count = 1
        elif num == candidate:
            count += 1
        else:
            count -= 1

    # 验证candidate是否确实出现次数超过n/2
    count = 0
    for num in list1:
        if num == candidate:
            count += 1

    if count > len(list1) / 2:
        return candidate
    else:
        return None  # 如果没有找到这样的元素，返回None


"""
列表、元组，字典的相同点，不同点有哪些，请罗列
相同点:
1.都是可迭代对象:
    列表、元组和字典都可以通过 for 循环进行迭代;
    可以使用 in 关键字检查某个元素是否存在。
2.都可以存储多种数据类型：
    列表和元组可以存储任意类型的元素，字典的值也可以是任意类型的数据，但字典的键通常是不可变的类型（如字符串、整数、元组等）。
3.都可以通过索引访问元素（字典通过键访问）：
    列表和元组可以通过整数索引来访问元素。
    字典通过键来访问对应的值。

不同点:
1. 可变性:
    列表和字典是可变的，可以修改元素的值，元组是不可变的，不能修改元素的值。
2.语法：
    列表是方括号 []，元组是圆括号 ()，字典是花括号 {}。
3.访问：
    列表和元组通过索引从0开始访问，字典通过键访问。
4.有序性：
    列表和元组是有序的，字典是无序的，且字典元素不可重复。
"""


# 5、将元组 (1,2,3) 和集合 {4,5,6} 合并成一个列表。
def func5(tuple1, set1):
    list1 = list(tuple1)
    list1.extend(list(set1))
    return list1


# 6、在列表 [1,2,3,4,5,6] 首尾分别添加整型元素 7 和 0。
def func6_1(list1):
    list1.insert(0, 7)
    list1.append(0)
    return list1


def func6_2(list1):  # 使用切片
    list1 = [7] + list1 + [0]  # 首尾分别添加 7 和 0
    return list1


# 7、反转列表 [0,1,2,3,4,5,6,7] 。
def func7(list1):
    list1.reverse()
    return list1


# 8、反转列表 [0,1,2,3,4,5,6,7] 后给出元素 5 的索引号。
def func8():
    list1 = [0, 1, 2, 3, 4, 5, 6, 7]
    list1.reverse()
    return list1.index(5)


# 9、分别统计列表 [True,False,0,1,2] 中 True,False,0,1,2的元素个数，发现了什么？
def func9():
    list1 = [True, False, 0, 1, 2]
    count_true = list1.count(True)
    count_false = list1.count(False)
    count_0 = list1.count(0)
    count_1 = list1.count(1)
    count_2 = list1.count(2)
    print("True的个数为：", count_true)
    print("False的个数为：", count_false)
    print("0的个数为：", count_0)
    print("1的个数为：", count_1)
    print("2的个数为：", count_2)


# 10、从列表 [True,1,0,‘x’,None,‘x’,False,2,True] 中删除元素‘x’。
def func10():
    lst = [True, 1, 0, 'x', None, 'x', False, 2, True]
    while 'x' in lst:
        lst.remove('x')
    print(lst)


# 11、从列表 [True,1,0,‘x’,None,‘x’,False,2,True] 中删除索引号为4的元素。
def func11():
    lst = [True, 1, 0, 'x', None, 'x', False, 2, True]
    lst.pop(4)
    print(lst)


# 12、删除列表中索引号为奇数的元素。
def func12_1():  # 添加到新列表
    lst = [True, 1, 0, 'x', None, 'x', False, 2, True]
    # 使用列表推导式保留索引为偶数的元素
    new_lst = [lst[i] for i in range(len(lst)) if i % 2 == 0]
    print(new_lst)


def func12_2():  # 直接修改原列表，反向遍历保证索引不变
    lst = [True, 1, 0, 'x', None, 'x', False, 2, True]
    # 反向遍历，删除索引为奇数的元素
    for i in range(len(lst) - 1, -1, -1):  # 从后往前遍历(start,stop,step)
        if i % 2 != 0:  # 索引为奇数
            del lst[i]
    print(lst)


# 13、清空列表中的所有元素。
def func13():
    lst = [True, 1, 0, 'x', None, 'x', False, 2, True]
    lst.clear()
    print(lst)
# 14、对列表 [3,0,8,5,7] 分别做升序和降序排列。
def func14():
    lst = [3, 0, 8, 5, 7]
    lst.sort()  # 升序
    print(lst)
    lst.sort(reverse=True)  # 降序
    print(lst)
# 15、将列表 [3,0,8,5,7] 中大于 5 元素置为1，其余元素置为0。
def func15():
    lst = [3, 0, 8, 5, 7]
    for i in range(len(lst)):
        if lst[i] > 5:
            lst[i] = 1
        else:
            lst[i] = 0
    print(lst)

if __name__ == '__main__':
    # 2、求两个有序数字列表的公共元素
    # a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    # b = [2, 5, 8, 9, 13]
    # print(func2(a, b))  # [2, 5, 8, 9]

    # 3、给定一个n个整型元素的列表a，其中有一个元素出现次数超过n/2，求这个元素
    # a = [1, 2, 2, 2, 3, 2, 2]
    # print(func3(a))

    # 5、将元组 (1,2,3) 和集合 {4,5,6} 合并成一个列表。
    # a = (1, 2, 3)
    # b = {4, 5, 6}
    # print(func5(a, b))  # [1, 2, 3, 4, 5, 6]

    # 6、在列表 [1,2,3,4,5,6] 首尾分别添加整型元素 7 和 0。
    # a = [1, 2, 3, 4, 5, 6]
    # print(func6_1(a))  # [7, 1, 2, 3, 4, 5, 6, 0]
    # print(func6_2(a))  # [7, 1, 2, 3, 4, 5, 6, 0]

    # 7、反转列表 [0,1,2,3,4,5,6,7] 。
    # print(func7([0, 1, 2, 3, 4, 5, 6, 7]))

    # 8、反转列表 [0,1,2,3,4,5,6,7] 后给出元素 5 的索引号。
    # print(func8())  # 2

    # 9、分别统计列表 [True,False,0,1,2] 中 True,False,0,1,2的元素个数。
    # func9()  # 发现了True等同1，False等同0

    # 10、从列表 [True,1,0,‘x’,None,‘x’,False,2,True] 中删除元素‘x’。
    # func10()

    # 11、从列表 [True,1,0,‘x’,None,‘x’,False,2,True] 中删除索引号为4的元素。
    # func11()

    # 12、删除列表中索引号为奇数的元素。[True,1,0,‘x’,None,‘x’,False,2,True]
    # func12_1()
    # func12_2()

    # 13、清空列表中的所有元素。
    # func13()

    # 14、对列表 [3,0,8,5,7] 分别做升序和降序排列。
    # func14()

    # 15、将列表 [3,0,8,5,7] 中大于 5 元素置为1，其余元素置为0。
    func15()
    pass
